import React from 'react';

interface ContextProps<T> {
  value: T
}

function createContext<T>(defaultValue: T) {
  interface State {
    value: T;
  }

  class Provider extends React.Component<ContextProps<T>, State> {
    static value: T = defaultValue;

    constructor(props: ContextProps<T>) {
      super(props);
      Provider.value = props.value;
      // this.state = {value: props.value}; //emmm 如果使用了 getDerivedStateFromProps 但不在构造函数里定义一个状态是会报警告的
    }

    // static getDerivedStateFromProps(nextProps: ContextProps<T>, prevState: State) {
    //     Provider.value = nextProps.value; // 最主要是这一句 要确保在子组件更新之前 他们能拿到的context是最新的 故不能在DidUpdate里设置(晚了) 然后现在componentWillUpdate又被废弃了 故只能使用该生命周期 使用
    //     return {...prevState, value: nextProps.value};//emmm 什么都不返回会报警告 这里随便返回都可以
    // }

    //↑↓等价的 但此api已被废弃
    componentWillReceiveProps(nextProps: ContextProps<T>, nextContext: any) {
      Provider.value = nextProps.value;
    }

    render() {
      return this.props.children;
    }
  }

  interface ConsumerProps {
    children: (value: T) => React.ReactNode
  }

  class Consumer extends React.Component<ConsumerProps> {
    render() {
      return this.props.children(Provider.value);
    }
  }

  return {
    Provider,
    Consumer
  }
}

export default createContext;
